package com.sse.servlet;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import com.sse.VO.PermisoVO;
import com.sse.VO.UsuarioVO;
import com.sse.autenticacion.Autenticacion;
import com.sse.autenticacion.IAutenticacion;

/**
 * Servlet Filter implementation class FiltroSeguridad
 */
public class FiltroSeguridad implements javax.servlet.Filter {

	//pagina a la que se va a enrutar si no esta autenticado
	private String PAGINA_INICIO;
	
	//pagina a la que se va a enrutar si no esta autorizado
	private String PAGINA_ERROR;
	
	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		HttpServletRequest httpRequest = (HttpServletRequest) request;

		UsuarioVO usuario  = null;
		boolean aceptado   = false;
		boolean permitido  = true;
		
		try
		{
			//Evaluar si esta en la pagina inicial
			if (!httpRequest.getRequestURI().equals(httpRequest.getContextPath() + "/") && !httpRequest.getRequestURI().equals(httpRequest.getContextPath() + PAGINA_INICIO)){
				
				//FALTA VALIDAR QUE EL RECURSO PEDIDO ESTE ACEPTADO PARA LOS ROLES DEL USUARIO
				if (httpRequest.getSession().getAttribute("usuario") == null) {
					
					IAutenticacion autenticacion = new Autenticacion();
					
					String userName = request.getParameter("userName");
					String password = request.getParameter("password");
									
					if(userName!= null && password!= null)
					{	
						//Se valida la autenticacion
						usuario = autenticacion.autenticar(userName, password);
				
						if (usuario == null){	
							//Ventana que indique que error al autenticar
							httpRequest.getSession().setAttribute("msjError","Revisar Clave o Usuario");
							aceptado = false;
							
						}else{
							//aceptar la peticion del usuario
							httpRequest.getSession().setAttribute("usuario",usuario);
							String permiso = request.getParameter("permiso");
							
							aceptado     	= true;
							permitido       = validarPermisos(usuario, permiso );
						}
						
					}else{
						//Ventana que indique que error al autenticar
						httpRequest.getSession().setAttribute("msjError","Falta digitar el nombre o la clave");
						aceptado = false;
					}
					
				}else{
					//Se valida si el usuario tiene permisos
					usuario 	   = (UsuarioVO)httpRequest.getSession().getAttribute("usuario");
					String permiso = request.getParameter("permiso");
					
					aceptado     	= true;
					permitido       = validarPermisos(usuario, permiso );
				}
			
			}else{
				//Primera ocasion que ingresa al sistema 
				aceptado  = false;
				permitido = false;
				
				//se destruye la sesion del usuario
				httpRequest.getSession().setAttribute("usuario",null);
			}

			
			if (aceptado) {
				if (permitido) {
					//aceptar la peticion del usuario
					chain.doFilter(request, response);
				}
				else{
					httpRequest.getRequestDispatcher(PAGINA_ERROR).forward(request, response);
				}
			}else{
				httpRequest.getRequestDispatcher(PAGINA_INICIO).forward(request, response);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public boolean validarPermisos(UsuarioVO vo, String permiso)
	{
		boolean aceptar = false;

		for (PermisoVO permisos : vo.getPermisos())
		{
			//System.out.println("PERMISO PAGINA:"+permiso+" PERMISO:"+ permisos.getNombre());
			 if (permisos.getNombre().trim().equalsIgnoreCase(permiso))	 
				 aceptar = true;
		
		}	 
			 
			
		return aceptar;
	}
	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		
		PAGINA_INICIO   = fConfig.getInitParameter("pagina_inicio");
		
		PAGINA_ERROR 	= fConfig.getInitParameter("pagina_error");
	}

}
